package com.foreknow.demo15;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * MySQL 8.0 以上版本的数据库连接有所不同：
 *
 * 1、MySQL 8.0 以上版本驱动包版本 mysql-connector-java-8.0.16.jar。
 *
 * 2、com.mysql.jdbc.Driver 更换为 com.mysql.cj.jdbc.Driver。
 *
 * 3. URL
 *    mysql5.x : jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf8&useSSL=true
 *    mysql8.x : jdbc:mysql://localhost:3306/数据库名?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
 */
public class JDBCDemo {
    public static void main(String[] args) {

        try {
            // 1. 加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 2. 获取连接
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/basic17?useUnicode=true&characterEncoding=utf8&useSSL=true","root","123456");
            // 3. 获取到Statement/PreparedStatement  如何获取：Statement	createStatement() 创建一个 Statement 对象来将 SQL 语句发送到数据库。
            //    Statement接口用于执行静态 SQL 语句并返回它所生成结果的对象。
            //    常用方法 : 1. ResultSet executeQuery(String sql)执行给定的 SQL 语句，该语句返回单个 ResultSet 对象（用于保存查询到的结果）。
            //     2. int	executeUpdate(String sql) 执行给定 SQL 语句，该语句可能为 INSERT、UPDATE 或 DELETE 语句，或者不返回任何内容的 SQL 语句（如 SQL DDL 语句）。
            //
            Statement stmt = conn.createStatement();
            // 4. 用于执行 SQL语句
            //int isRight = stmt.executeUpdate("insert into employee(username,password) values('fender','123456')");
            //int isRight = stmt.executeUpdate("delete from employee where id=1");
            //System.out.println(isRight);
            //接口 ResultSet 表示数据库结果集的数据表，通常通过执行查询数据库的语句生成。
            //ResultSet 对象具有指向其当前数据行的光标。最初，光标被置于第一行之前。next 方法将光标移动到下一行；
            //因为该方法在 ResultSet 对象没有下一行时返回 false，所以可以在 while 循环中使用它来迭代结果集
            //1. boolean next() 将光标从当前位置向下移一行。
            ResultSet rs = stmt.executeQuery("select * from employee"); //会将查询的结果保存到ResultSet集合中
            List<Employee> list = new ArrayList<>();
            while(rs.next()) {
                //获取到当前行的第几列数据
                int id = rs.getInt("id");
                String usenrame = rs.getString("username");
                String password = rs.getString("password");
                //将结果集中的数据保存到对象中
                Employee emp = new Employee();
                emp.setId(id);
                emp.setUsername(usenrame);
                emp.setPassword(password);
                //将Employee对象保存到List集合中
                list.add(emp);
            }
            for (Employee e:list) {
                System.out.println(e.getUsername());
            }
            // 5. 释放资源
            rs.close();
            stmt.close();
            conn.close();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
}
